﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Security;
using GameStepAzure.Models;
using EntityModel = GameStepAzure.Areas.Admin.Models;

namespace GameStepAzure.Controllers
{

    public class CarritoController : Controller
    {
        //
        // GET: /Carrito/

        [AllowAnonymous]
        public ActionResult Index()
        {
            return View(leeProductos());
        }

        [AllowAnonymous]
        public ActionResult AgregarProducto(int itemId, string returnUrl, int cantidad)
        {
            // Lee lista
            List<ProductoCarrito> lst = leeProductos();
            MembershipUser usr = Membership.GetUser();

            // Analiza la URL que realizo la peticion
            if (!Url.IsLocalUrl(returnUrl))
            {
                // Redirecciona a una URL vacia
                Redirect("http://");
            }
            else
            {
                bool nuevo;
                ProductoCarrito prodCarrito;
                prodCarrito = lst.Find(o => o.Producto.Id == itemId);
                if (prodCarrito == null)
                {
                    // Lee el producto del catalogo
                    IFachadaProductos fachada = new FachadaProductos();
                    Producto producto = fachada.BuscaProducto(new Producto { Id = itemId });
                    if (producto.PrecioDescuento > 0)
                    {
                        producto.Precio = producto.PrecioDescuento;
                    }

                    // Crea una nueva instancia
                    prodCarrito = new ProductoCarrito();
                    prodCarrito.Producto = producto;
                    prodCarrito.Cantidad = cantidad;
                    prodCarrito.User = usr;

                    nuevo = true;
                }
                else
                {
                    nuevo = false;
                }

                // Agrega a la base de datos
                if (usr != null)
                {
                    using (EntityModel.GameStoreEntities context = new EntityModel.GameStoreEntities())
                    {
                        if (nuevo)
                        {
                            context.ProductoCarrito.AddObject(EntityModel.GameStoreMapper.ProductoCarritoModelToEntity(prodCarrito));
                        }
                        else
                        {
                            Guid uid = new Guid(Convert.ToString(usr.ProviderUserKey));
                            EntityModel.ProductoCarrito pcEntity = context.ProductoCarrito.ToList().Find(o => o.producto_id == prodCarrito.Producto.Id && o.user_id.Equals(uid));

                            pcEntity.cantidad += cantidad;

                            if (pcEntity.cantidad > 5)
                            {
                                pcEntity.cantidad = 5;
                            }
                        }

                        context.SaveChanges();
                    }
                }
                // Agrega a la sesion
                else
                {
                    if (nuevo)
                    {
                        // Si es de la sesion entonces no necesita alterar la lista
                        lst.Add(prodCarrito);
                    }
                    else
                    {
                        // Solo edita la cantidad del objeto                    
                        prodCarrito.Cantidad += cantidad;

                        if (prodCarrito.Cantidad > 5)
                        {
                            prodCarrito.Cantidad = 5;
                        }
                    }

                    // Guarda la lista en la session
                    if (Session["carrito"] == null)
                    {
                        Session["carrito"] = lst;
                    }
                }
            }

            return Redirect(returnUrl);
        }
        [AllowAnonymous]
        public ActionResult Actualizar(int Id, int Cantidad)
        {
            MembershipUser usr = Membership.GetUser();

            if (usr != null)
            {
                // Actualiza en la propiedad
                using (EntityModel.GameStoreEntities context = new EntityModel.GameStoreEntities())
                {
                    Guid uid = new Guid(Convert.ToString(usr.ProviderUserKey));
                    EntityModel.ProductoCarrito pcEntity = context.ProductoCarrito.ToList().Find(o => o.producto_id == Id && o.user_id.Equals(uid));
                    pcEntity.cantidad = Cantidad;

                    context.SaveChanges();
                }
            }
            else
            {
                // Actualiza el objeto de la session
                List<ProductoCarrito> lst = (List<ProductoCarrito>)Session["carrito"];
                ProductoCarrito productoCarrito = lst.Find(x => x.Producto.Id == Id);
                productoCarrito.Cantidad = Cantidad;
            }

            return RedirectToAction("Index");
        }

        public ActionResult Eliminar(int Id)
        {
            MembershipUser usr = Membership.GetUser();
            if (usr != null)
            {
                using (EntityModel.GameStoreEntities context = new EntityModel.GameStoreEntities())
                {
                    Guid uid = new Guid(Convert.ToString(usr.ProviderUserKey));
                    EntityModel.ProductoCarrito pcEntity = context.ProductoCarrito.ToList().Find(o => o.producto_id == Id && o.user_id.Equals(uid));
                    context.ProductoCarrito.DeleteObject(pcEntity);

                    context.SaveChanges();
                }
            }
            else
            {
                List<ProductoCarrito> lst = (List<ProductoCarrito>)Session["carrito"];
                ProductoCarrito productoBorrar = lst.Find(x => x.Producto.Id == Id);
                lst.Remove(productoBorrar);
            }

            return RedirectToAction("Index");
        }

        [Authorize(Roles = "Usuario")]
        public ActionResult RealizarCompra()
        {
            //if (Membership.GetUser() != null)
            //{
            //    return View();
            //}
            //else
            //{
            //    return RedirectToAction("Login", "Perfil");
            //}

            return View();
        }

        [HttpPost]
        public ActionResult RealizarCompra(OrdenCompra orden)
        {

            //guarda en la session la orden
            Session["orden"] = orden;


            return RedirectToAction("FinalizarCompra");

        }

        //deespues debe de haber un httpost para obtener los datos de realizar compra...

        [Authorize(Roles = "Usuario")]
        public ActionResult FinalizarCompra(OrdenCompra orden)
        {

            return View(leeProductos());
        }


        public ActionResult GuardarCompra()
        {
            //obtiene de la sesion la orden para ser guardada en la base de datos
            OrdenCompra orden = (OrdenCompra)Session["orden"];

            //obtiene los productos del carrito
            List<ProductoCarrito> productoCarrito = leeProductos();

            if (productoCarrito != null && productoCarrito.Count != 0)
            {
                using (EntityModel.GameStoreEntities context = new EntityModel.GameStoreEntities())
                {
                    // Crea la entidad de orden de compra
                    Guid user_id = new Guid(Convert.ToString(Membership.GetUser().ProviderUserKey));
                    EntityModel.OrdenCompra ordenEntity = EntityModel.GameStoreMapper.OrdenCompraModelToentity(orden, user_id);

                    // Guarda la orden de compra
                    context.OrdenCompra.AddObject(ordenEntity);

                    // Guarda detalles de compra para cada producto carrito
                    double montoTotal = 0;
                    EntityModel.DetalleCompra detalleEntity;
                    foreach (ProductoCarrito item in productoCarrito)
                    {
                        detalleEntity = new EntityModel.DetalleCompra();

                        detalleEntity.Cantidad = item.Cantidad;
                        detalleEntity.Num_Orden = ordenEntity.Num_Orden;
                        detalleEntity.id_producto = item.Producto.Id;
                        if (item.Producto.PrecioDescuento > 0)
                        {
                            detalleEntity.Precio = item.Producto.PrecioDescuento;
                        }
                        else
                        {
                            detalleEntity.Precio += item.Producto.Precio;
                        }

                        montoTotal += detalleEntity.Precio;
                        context.DetalleCompra.AddObject(detalleEntity);

                        // Borra los productos del carrito
                        context.ProductoCarrito.DeleteObject(context.ProductoCarrito.ToList().Find(x => x.producto_id == item.Producto.Id));
                    }

                    // Asigna el monto total calculado
                    ordenEntity.MontoTotal = montoTotal;

                    context.SaveChanges();
                }
            }
            return View("CompraFinalizada");
        }

        public ActionResult CompraFinalizada(OrdenCompra orden)
        {
            return View();
        }

        private List<ProductoCarrito> leeProductos()
        {
            List<ProductoCarrito> lst = null;

            // Usuario autentificado
            MembershipUser usr = Membership.GetUser();
            if (usr != null)
            {
                using (EntityModel.GameStoreEntities context = new EntityModel.GameStoreEntities())
                {
                    Guid uid = new Guid(Convert.ToString(usr.ProviderUserKey));
                    List<EntityModel.ProductoCarrito> entities = context.ProductoCarrito.ToList().FindAll(o => o.user_id.Equals(uid));

                    lst = new List<ProductoCarrito>(entities.Count);

                    foreach (EntityModel.ProductoCarrito pc in entities)
                    {
                        lst.Add(EntityModel.GameStoreMapper.ProductoCarritoEntityToModel(pc));
                    }
                }
            }
            // Usuario anonimo
            else
            {
                if (Session["carrito"] != null)
                {
                    lst = (List<ProductoCarrito>)Session["carrito"];
                }
                else
                {
                    lst = new List<ProductoCarrito>(0);
                }
            }
            return lst;
        }
    }
}
